package com.example.housekeeping.service.impl;

import com.example.housekeeping.ex.ServiceException;
import com.example.housekeeping.pojo.entity.Comment;
import com.example.housekeeping.pojo.dto.CommentAddNewDTO;
import com.example.housekeeping.pojo.dto.CommentUpdateDTO;
import com.example.housekeeping.pojo.vo.CommentListItemVO;
import com.example.housekeeping.pojo.vo.CommentStandardVO;
import com.example.housekeeping.mapper.CommentMapper;
import com.example.housekeeping.service.CommentService;
import com.example.housekeeping.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 评论表(Comment)表服务实现类
 *
 * @author bob
 * @since 2023-03-20 19:36:07
 */
@Slf4j
@Service
public class CommentServiceImpl implements CommentService {
    @Autowired
    private CommentMapper commentMapper;

    /**
     * 新增数据
     *
     * @param commentAddNewDTO 实例对象
     */
    @Override
    public void addNew(CommentAddNewDTO commentAddNewDTO) {
        //查询是否存在用户ID和服务员ID，如果存在则抛出，因为只能评论一条
        Comment countByUserIdAndWorkerId = new Comment();
        countByUserIdAndWorkerId.setUserId(commentAddNewDTO.getUserId());
        countByUserIdAndWorkerId.setWorkerId(commentAddNewDTO.getWorkerId());
        long count = commentMapper.count(countByUserIdAndWorkerId);
        if (count > 1) {
            String message = "不好意思，你已经评论过了";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }
        //创建Comment对象
        Comment comment = new Comment();
        BeanUtils.copyProperties(commentAddNewDTO, comment);
        // 调用Mapper对象的insert()执行插入评论数据
        log.debug("即将执行插入数据，参数：{}", comment);
        commentMapper.insert(comment);
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     */
    @Override
    public void deleteById(Long id) {
        //查询是否存在评论，如果不存在抛出异常
        CommentStandardVO standardById = commentMapper.getStandardById(id);
        if (standardById == null) {
            String message = "删除评论不存在，";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        // 调用Mapper对象的deleteById()方法执行删除
        log.debug("即将执行删除，参数：{}", id);
        commentMapper.deleteById(id);
    }

    /**
     * 修改数据
     *
     * @param commentUpdateDTO 实例对象
     */
    @Override
    public void updateById(Long id, CommentUpdateDTO commentUpdateDTO) {
        log.debug("开始处理【修改详情】的业务，ID：{}，新数据：{}", id, commentUpdateDTO);
        //查询修改内容与原来的是否一致，是抛出
        Comment countByContent=new Comment();
        countByContent.setContent(commentUpdateDTO.getContent());
        long count = commentMapper.count(countByContent);
        if (count > 0) {
            String message = "修改失败，修改内容与原来一致！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }
        //查询是否存在数据，如果不存在抛出异常
        CommentStandardVO standardById = commentMapper.getStandardById(id);
        if (standardById == null) {
            String message = "修改评论不存在，";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }

        //创建Comment对象
        Comment comment = new Comment();
        BeanUtils.copyProperties(commentUpdateDTO, comment);
        comment.setId(id);
        // 调用Mapper对象的insert()执行修改评论数据
        log.debug("即将执行修改数据，参数：{}", comment);
        commentMapper.update(comment);

    }

    @Override
    public void setPass(Long id) {
        log.debug("开始处理【通过评论】的业务，参数：{}", id);
        updateIsPassById(id, 1);
    }

    @Override
    public void setNotPass(Long id) {
        log.debug("开始处理【未通过评论】的业务，参数：{}", id);
        updateIsPassById(id, 0);
    }

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public CommentStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询详情】的业务，参数：{}", id);
        CommentStandardVO standardById = commentMapper.getStandardById(id);
        if (standardById == null) {
            String message = "查询失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        return standardById;
    }

    /**
     * 查询列表数据
     *
     * @return 对象列表
     */
    @Override
    public List<CommentListItemVO> list() {
        log.debug("开始处理【查询评论列表】的业务，无参数");
        List<CommentListItemVO> list = commentMapper.list();
        return list;
    }

    /**
     * 根据服务员编号查询
     * @param workerId 服务员编号
     * @return 源于服务员列表
     */
    @Override
    public List<CommentListItemVO> listByWorkerId(Long workerId) {
        commentMapper.listByWorkerId(workerId);
        return null;
    }

    private void updateIsPassById(Long id, Integer pass) {
        CommentStandardVO currentComment = commentMapper.getStandardById(id);
        if (currentComment == null) {
            String message = PASS_TEXT[pass] + "评论失败，评论数据不存在";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }

        if (currentComment.getIsPass() == pass) {
            String message = PASS_TEXT[pass] + "评论失败，此评论已经处于" + PASS_TEXT[pass] + "状态";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }

        Comment updateComment = new Comment();
        updateComment.setId(id);
        updateComment.setIsPass(pass);
        int rows = commentMapper.update(updateComment);
        if (rows != 1) {
            String message = PASS_TEXT[pass] + "评论失败，服务器忙，请稍后再尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_UPDATE, message);
        }
    }

}
